﻿using System;
using System.Collections.Generic;
using System.Text;
using System.CodeDom;

namespace _0512063_0512082
{
    class CCodeGenerator:CodeGenerator
    {
        
        public CCodeGenerator(CodeMemberMethod method):base(method)
        { }

        /// <summary>
        /// Phát sinh hàm nhập các giá trị tham số
        /// </summary>
        /// <returns></returns>
        public override object inputFunction()
        {
            // tạo prototype của hàm
            List<Object> para = getParameters();
            String rs = "void " + prefix_in + serparator
                + getMethodName() + open_func;

            for (int i = 0; i < para.Count; i++)
            {
                CodeParameterDeclarationExpression p = (CodeParameterDeclarationExpression)para[i];
                /// nếu là mảng là ArrayRank là 1
                String type = p.Type.ArrayRank == 1 ? (p.Type.BaseType + "* "):(p.Type.BaseType + "& ");
                String name = p.Name;
                rs += type + name;
                if (i < para.Count - 1)
                    rs += comma;// ,
            }
            // ~ tạo prototype của hàm

            // tạo thân hàm

            // lấy danh sách các tham số, phát sinh các statement nhập
            rs += end_func; // )
            rs += start_package; // {

            for (int i = 0; i < para.Count; i++)
            {
                CodeParameterDeclarationExpression p = (CodeParameterDeclarationExpression)para[i];                
                String name = ((CodeParameterDeclarationExpression)p).Name;
                rs += tab + "cout<<\"" + inputdirection + name + "\"" + endline;
                rs += tab + "cin>>" + name + endline;
            }

            rs += end_package; // }
            return rs;
        }

        /// <summary>
        /// phat sinh ham xuat ket qua
        /// </summary>
        /// <returns></returns>
        public override object outputFunction()
        {
            if (getReturnType().Equals(String.Empty))
                return String.Empty;

            String rs = "void " + prefix_out + serparator 
                + getMethodName() + open_func + getReturnType() + dummy + end_func;
            rs += start_package;
            rs += tab + "cout<<" + dummy + endline;
            rs += end_package;
            return rs;
        }

        /// <summary>
        /// phát sinh hàm xử lý chính
        /// </summary>
        /// <returns></returns>
        public override object processFunction()
        {
            return null;
        }

        /// <summary>
        /// phát sinh hàm main
        /// </summary>
        /// <returns></returns>
        public override object mainFunction()
        {
            return base.mainFunction();
        }
        /// <summary>
        /// phát sinh toàn bộ chương trình
        /// </summary>
        /// <returns></returns>
        public override object start()
        {
            return base.start();
        }       
        
    }
}
